# -*- coding: utf-8 -*-
"""
@Time ：2021/3/30 20:03 
@Auth ： Mr. William 1052949192
@Company ：特斯汀学院 @testingedu.com.cn
@Function ：反射
"""
import traceback


class A:
    """示例类"""

    def func1(self):
        print('函数1')

    def func2(self, a, b):
        print(a + b)
        print('函数2')

    def func3(self, c='1', d='2'):
        print(c + d)
        print('函数3')


# 我需要实现：输入func1和参数，它运行A类的func1函数；以此类推
func_name = input('请输入你要运行的函数：')
func_params = input('请输入参数列表：')
if func_params:
    func_params = func_params.split(',')

a = A()

# # 传统的if...eles
# if func_name == 'func1':
#     a.func1()
# elif func_name == 'func2':
#     a.func2(*func_params)
# elif func_name == 'func3':
#     a.func3(*func_params)

# 使用反射
"""
反射：程序在运行的过程中，动态的获取需要运行的方法
注意：如果函数不需要参数，那么就不要传任何东西
      如果函数都是必填参数，那么就不需都传
      如果函数是非必填参数，你不能传超过函数最大数量的参数
"""
try:
    # 尝试执行可能报错的代码
    f = getattr(a, func_name)
except Exception as e:
    # 如果报错了，就执行这里面的代码
    # 如果不报错，就只执行try里面的代码
    print('函数不存在')
    # 获取报错的堆栈信息的
    print(traceback.format_exc())
finally:
    # 不管try里面的代码是否执行成功，最终都要执行这里面的代码
    print('反射获取函数完成')

# print(func_params)
# if func_params:
#     f(*func_params)
# else:
#     f()
